home *** CD-ROM | disk | FTP | other *** search
- {
- Here's a good (but a little slow) Program to calculate the
- decimals of Pi :
-
-
- THIS Program CompUTES THE DIGITS of PI USinG THE ARCTANGENT ForMULA
- (1) PI/4 = 4 ARCTAN 1/5 - ARCTAN 1/239
- in CONJUNCTION With THE GREGorY SERIES
-
- (2) ARCTAN X = SUM (-1)^N*(2N + 1)^-1*X^(2N+1) N=0 to inFinITY.
-
- SUBSTITUTinG into (2) A FEW VALUES of N and NESTinG WE HAVE,
-
- PI/4 = 1/5[4/1 + 1/25[-4/3 + 1/25[4/5 + 1/25[-4/7 + ...].].]
-
- - 1/239[1/1 + 1/239^2[-1/3 + 1/239^2[1/5 + 1/239^2[-1/7 +...].].]
-
- USinG THE LONG divISION ALGorITHM, THIS ( NESTED ) inFinITE SERIES CAN BE
- USED to CALCULATE PI to A LARGE NUMBER of DECIMAL PLACES in A REASONABLE
- AMOUNT of TIME. A TIME Function IS inCLUDED to SHOW HOW SLOW THinGS
- GET WHEN N IS LARGE. IMPROVEMENTS CAN BE MADE BY CHANGinG THE SIZE of
- THE Array ELEMENTS HOWEVER IT GETS A BIT TRICKY.
-
- }
-
- Uses
- Crt;
-
- Var
- B,C,V,P1,S,K,N,I,J,Q,M,M1,X,R,D : Integer;
- P,A,T : Array[0..5000] of Integer;
-
- Const F1=5;
- Const F2=239;
- Procedure divIDE(D : Integer);
- begin
- R:=0;
- For J:=0 to M do
- begin
- V:= R*10+P[J];
- Q:=V div D;
- R:=V Mod D;
- P[J]:=Q;
- end;
- end;
- Procedure divIDEA(D : Integer);
- begin
- R:=0;
- For J:=0 to M do
- begin
- V:= R*10+A[J];
- Q:=V div D;
- R:=V Mod D;
- A[J]:=Q;
- end;
- end;
- Procedure SUBT;
- begin
- B:=0;
- For J:=M Downto 0 do
- if T[J]>=A[J] then T[J]:=T[J]-A[J] else
- begin
- T[J]:=10+T[J]-A[J];
- T[J-1]:=T[J-1]-1;
- end;
- For J:=0 to M do
- A[J]:=T[J];
- end;
- Procedure SUBA;
- begin
- For J:=M Downto 0 do
- if P[J]>=A[J] then P[J]:=P[J]-A[J] else
- begin
- P[J]:=10+P[J]-A[J];
- P[J-1]:=P[J-1]-1;
- end;
- For J:= M Downto 0 do
- A[J]:=P[J];
- end;
- Procedure CLEARP;
- begin
- For J:=0 to M do
- P[J]:=0;
- end;
- Procedure ADJUST;
- begin
- P[0]:=3;
- P[M]:=10;
- For J:=1 to M-1 do
- P[J]:=9;
- end;
-
- Procedure ADJUST2;
- begin
- P[0]:=0;
- P[M]:=10;
- For J:=1 to M-1 do
- P[J]:=9;
- end;
-
- Procedure MULT4;
- begin
- C:=0;
- For J:=M Downto 0 do
- begin
- P1:=4*A[J]+C;
- A[J]:=P1 Mod 10;
- C:=P1 div 10;
- end;
- end;
-
- Procedure SAVEA;
- begin
- For J:=0 to M do
- T[J]:=A[J];
- end;
-
- Procedure TERM1;
- begin
- I:=M+M+1;
- A[0]:=4;
- divIDEA(I*25);
- While I>3 do
- begin
- I:=I-2;
- CLEARP;
- P[0]:=4;
- divIDE(I);
- SUBA;
- divIDEA(25);
- end;
- CLEARP;
- ADJUST;
- SUBA;
- divIDEA(5);
- SAVEA;
- end;
- Procedure TERM2;
- begin
- I:=M+M+1;
- A[0]:=1;
- divIDEA(I);
- divIDEA(239);
- divIDEA(239);
- While I>3 do
- begin
- I:=I-2;
- CLEARP;
- P[0]:=1;
- divIDE(I);
- SUBA;
- divIDEA(239);
- divIDEA(239);
- end;
- CLEARP;
- ADJUST2;
- SUBA;
- divIDEA(239);
- SUBT;
- end;
-
- {MAin Program}
-
- begin
- ClrScr;
- WriteLn(' THE CompUTATION of PI');
- WriteLn(' -----------------------------');
- WriteLn('inPUT NO. DECIMAL PLACES');
- READLN(M1);
- M:=M1+4;
- For J:=0 to M do
- begin
- A[J]:=0;
- T[J]:=0;
- end;
- TERM1;
- TERM2;
- MULT4;
- WriteLn;WriteLn;
- Write('PI = 3.');
- For J:=1 to M1 do
- begin
- Write(A[J]);
- if J Mod 5 =0 then Write(' ');
- if J Mod 50=0 then Write(' ');
- end;
- WriteLn;WriteLn;
- WriteLn;
- end.